package ar.com.profertil.frances.service;

import java.io.IOException;
import java.util.Collection;

import org.xml.sax.SAXException;

import ar.com.profertil.frances.entity.AltaClientesFrances;
import ar.com.profertil.frances.entity.Cliente;
import ar.com.profertil.frances.parser.ParserIdocAltaClientesFrances;
import ar.com.profertil.utils.service.EnviarArchivoBancoService;
import ar.com.profertil.utils.service.RSABC;
import ar.com.profertil.utils.service.RecibirArchivoBancoService;
import ar.com.profertil.utils.service.TripleDES;

// TODO: Auto-generated Javadoc
/**
 * Esta clase refleja el servicio de Alta de clientes para el Frances.
 */
public class AltaClienteFrancesService {

	/** The Constant WORKING_PATH. */
	private static final String WORKING_PATH = "/interface/tempws/";

	/** The Constant ORIGIN_FILE_NAME. */
	private static final String ORIGIN_FILE_NAME = "altaClientesFrancesEnc";

	/** The Constant DEST_FILE_NAME. */
	private static final String DEST_FILE_NAME = "altaClientesFrances.txt";

	/** The Constant CERTIFICADO_FILE_NAME. */
	private static final String CERTIFICADO_FILE_NAME = "CERT_WS_PRD_BANCA_CUIT30700005573_NUP03508354_vto08-06-2014(pass_canales).pfx";

	/** The Constant PASS_CERTIFICADO. */
	private static final String PASS_CERTIFICADO = "canales";

	/** The rabs. */
	private RecibirArchivoBancoService rabs;

	/**
	 * Instantiates a new alta cliente frances service.
	 */
	public AltaClienteFrancesService() {
		rabs = new RecibirArchivoBancoService();
	}

	/**
	 * Recibir archivo.
	 * 
	 * @param clave3Des
	 *            the clave3 des
	 * @param firmaArchivo
	 *            the firma archivo
	 * @return the alta clientes frances
	 */
	public AltaClientesFrances recibirArchivo(String clave3Des, String firmaArchivo) {
		try {
			return recibir(WORKING_PATH, CERTIFICADO_FILE_NAME, ORIGIN_FILE_NAME, DEST_FILE_NAME, clave3Des,
					PASS_CERTIFICADO, firmaArchivo);
		} catch (Exception e) {
			e.printStackTrace();
		}
		return null;
	}

	/**
	 * Recibir archivo.
	 * 
	 * @param workinPath
	 *            the workin path
	 * @param nombreCertificado
	 *            the nombre certificado
	 * @param nombreArchivoOrigen
	 *            the nombre archivo origen
	 * @param nombreArchivoDestino
	 *            the nombre archivo destino
	 * @param clave3Des
	 *            the clave3 des
	 * @param password
	 *            the password
	 * @param firmaArchivo
	 *            the firma archivo
	 * @return the alta clientes frances
	 */
	public AltaClientesFrances recibirArchivo(String workinPath, String nombreCertificado, String nombreArchivoOrigen,
			String nombreArchivoDestino, String clave3Des, String password, String firmaArchivo) {
		try {
			return recibir(workinPath, nombreCertificado, nombreArchivoOrigen, nombreArchivoDestino, clave3Des,
					password, firmaArchivo);
		} catch (Exception e) {
			e.printStackTrace();
		}
		return null;
	}

	/**
	 * Recibir archivo.
	 * 
	 * @param encripted
	 *            the encripted string
	 * @param password
	 *            the password
	 * @param keyStorageView
	 *            the key storage view
	 * @param sAlias
	 *            the alias of a key in the key storage view
	 * @return the alta clientes frances
	 */
	public AltaClientesFrances recibirArchivo(String encripted, String password, String keyStorageView, String sAlias) {
		try {
			return recibir(encripted, password, keyStorageView, sAlias);
		} catch (Exception e) {
			e.printStackTrace();
		}
		return null;
	}

	/**
	 * Recibir.
	 * 
	 * @param workingPath
	 *            the working path
	 * @param nombreCertificado
	 *            the nombre certificado
	 * @param nombreArchivoOrigen
	 *            the nombre archivo origen
	 * @param nombreArchivoDestino
	 *            the nombre archivo destino
	 * @param clave3Des
	 *            the clave3 des
	 * @param password
	 *            the password
	 * @param firmaArchivo
	 *            the firma archivo
	 * @return the alta clientes frances
	 * @throws Exception
	 *             the exception
	 */
	private AltaClientesFrances recibir(String workingPath, String nombreCertificado, String nombreArchivoOrigen,
			String nombreArchivoDestino, String clave3Des, String password, String firmaArchivo) throws Exception {
		ParserIdocAltaClientesFrances parser = new ParserIdocAltaClientesFrances();
		AltaClientesFrances aprf = (AltaClientesFrances) rabs.recibirArchivo(workingPath, nombreCertificado,
				nombreArchivoOrigen, nombreArchivoDestino, clave3Des, password, null, null, firmaArchivo, parser, true,
				false);
		return aprf;
	}

	/**
	 * Recibir.
	 * 
	 * @param encripted
	 *            the encripted string
	 * @param password
	 *            the password
	 * @param keyStorageView
	 *            the key storage view
	 * @param sAlias
	 *            the alias of a key in the key storage view
	 * @return the alta clientes frances
	 * @throws Exception
	 *             the exception
	 */
	private AltaClientesFrances recibir(String encripted, String password, String keyStorageView, String sAlias)
			throws Exception {
		ParserIdocAltaClientesFrances parser = new ParserIdocAltaClientesFrances();
		AltaClientesFrances aprf = (AltaClientesFrances) rabs.recibirArchivo(encripted, password, keyStorageView,
				sAlias, parser);
		return aprf;
	}

	/**
	 * PI envia un XML y hay que devolver un string encriptado de longitud fija
	 * 
	 * @param xml
	 *            a parsear
	 * 
	 * @return String encriptado para enviar al banco
	 * @throws Exception
	 * */
	public String generarArchivoFrances(String xml, String password, String keyStorageView, String sAlias)
			throws Exception {
		ParserIdocAltaClientesFrances parser = new ParserIdocAltaClientesFrances();
		
		// convierto el xml en un string con los valores de los 
		//tags concatenados (todos con longitud fija)
		Collection<Cliente> clientes = parser.getClientes(xml);
		StringBuilder sb = new StringBuilder();
		for (Cliente cliente : clientes) {
			sb.append(cliente.toFileFormatter());
			sb.append(System.getProperty("line.separator"));
		}
		String stringFile = sb.toString();
		//System.out.println("el archivo sin encriptar: \n" + stringFile);
		return new EnviarArchivoBancoService().enviarArchivo(stringFile, keyStorageView, sAlias, password);
	}
}
